package coder.user.service.impl;

import coder.common.BaseContext;
import coder.exception.BaseException;
import coder.user.entity.Approve;
import coder.user.mapper.ApproveMapper;
import coder.user.service.IApproveService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class ApproveServiceImpl extends ServiceImpl<ApproveMapper, Approve> implements IApproveService {
    /**
     * 提交审核请求
     * 此方法用于处理用户提交的审核请求，首先检查当前用户是否已提交审核，以防止重复提交
     * 如果已存在未完成的审核记录，则抛出异常提示用户不得重复提交
     * 否则，将当前审核请求保存到数据库中
     *
     * @param approve 审核对象，包含审核的相关信息
     */
    @Override
    public void submitApprove(Approve approve) {
        // 创建查询条件，根据当前用户ID查询审核记录
        LambdaQueryWrapper<Approve> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Approve::getUserId, BaseContext.getCurrentId());

        // 执行查询，获取当前用户的审核记录
        Approve result = this.getOne(queryWrapper);

        // 如果查询到审核记录，说明已提交审核，抛出异常防止重复提交
        if(result != null ) {
            if(result.getState() == 0) {
                throw new BaseException("已提交审核，请勿重复提交");
            }
            if(result.getState() == 1) {
                throw new BaseException("认证已通过，请勿重复提交");
            }
        }
            approve.setUserId(BaseContext.getCurrentId());
            // 保存当前审核请求到数据库
            this.save(approve);
    }

    /**
     * 更新审批状态
     * 此方法用于处理审批状态的更新，主要目的是避免重复提交审批请求
     * 它首先检查当前审批的状态，如果已经提交或通过，则抛出异常阻止重复提交
     * 最后，将审批状态重置为未提交状态，并更新数据库中的审批记录
     *
     * @param approve 待更新的审批对象，包含新的审批信息
     * @throws BaseException 如果审批已提交或已通过，则抛出异常，防止重复操作
     */
    @Override
    public void updateApprove(Approve approve) {
        // 获取当前审批记录，以便检查其状态
        Approve result = this.getById(approve.getId());

        // 检查审批状态是否为已提交，如果是，则抛出异常阻止重复提交
        if(result.getState() == 0) {
            throw new BaseException("已提交审核，请勿重复提交");
        }

        // 检查审批状态是否为已通过，如果是，则抛出异常阻止重复提交
        if(result.getState() == 1) {
            throw new BaseException("认证已通过，请勿重复提交");
        }

        // 设置审批状态为未提交，并准备更新数据库中的审批记录
        approve.setState(0);

        // 更新数据库中的审批记录
        this.updateById(approve);
    }
}
